<template>
  <h2>当前求和为：{{sum}}</h2>
  <button @click="sum++">点我+1</button>
  <hr>
  <h2>当前的信息为：{{msg}}</h2>
  <button @click="msg+='!'">修改信息</button>
  <hr>
  <h2>姓名：{{person.name}}</h2>
  <h2>年龄：{{person.age}}</h2>
  <h2>职位：{{person.job.j1.position}}</h2>
  <button @click="person.name+='~'">修改姓名</button>
  <button @click="person.age++">增长年龄</button>
  <button @click="person.job.j1.position+='~'">修改职位</button>
</template>

<script>
import { ref, reactive, watch, watchEffect } from 'vue'
export default {
  name: 'Demo',
  /*watch: {
    // sum(newValue, oldValue) {
    //   console.log('sum的值变化了', newValue, oldValue)
    // }
    sum: {
      immediate: true,
      deep: true,
      handler(newValue, oldValue) {
        console.log('sum的值变化了', newValue, oldValue)
      }
    }
  },*/
  setup() {
    // 数据
    let sum = ref(0)
    let msg = ref('你好啊')
    /*
    // let person = ref({
    //   name: '张三',
    //   age: 18
    // })
    // watch(person.value, (newValue, oldValue) => {
    //   console.log('person变化了', newValue, oldValue)
    // })
    // watch(person, (newValue, oldValue) => {
    //   console.log('person变化了', newValue, oldValue)
    // }, {deep: true})
    */

    let person = reactive({
      name: '张三',
      age: 18,
      job: {
        j1: {
          position: '新生代农民工'
        }
      }
    })

    // 情况一：监视ref定义的一个响应式数据
    // watch(sum, (newValue, oldValue) => {   // 基本类型数据不能.value监听
    //   console.log('sum的值变化了', newValue, oldValue)
    // })

    // 情况二：监视多个ref定义的多个响应式数据
    // watch(sum, (newValue, oldValue) => {
    //   console.log('sum的值变化了', newValue, oldValue)
    // })
    // watch(msg, (newValue, oldValue) => {
    //   console.log('msg的值变化了', newValue, oldValue)
    // }) // or
    // watch([sum, msg], (newValue, oldValue) => {
    //   console.log('sum或msg变化了', newValue, oldValue)
    // }, {immediate: true})

    /* 情况三：监视reactive定义的一个响应式数据的全部属性
      若watch监视的是reactive定义的响应式数据，则无法正确获得oldValue!!
      若watch监视的是reactive定义的响应式数据，则强制开启了深度监视
    */
    // watch(person, (newValue, oldValue) => {
    //   console.log('person变化了', newValue, oldValue) // 此处的deep配置不再奏效
    // })

    // 情况四：监视reactive定义的一个响应式数据中的某个属性
    // watch(() => person.name, (newValue, oldValue) => {
    //   console.log('person的name变化了', newValue, oldValue)
    // })
    // watch(() => person.job, (newValue, oldValue) => {
    //   console.log('person的job变化了', newValue, oldValue)
    // }, {immediate: true, deep: true})

    // 情况五：监视reactive定义的一个响应式数据中的某些属性
    // watch([() => person.job, () => person.name], (newValue, oldValue) => {
    //   console.log('person的job或name变化了', newValue, oldValue)
    // }, {immediate: true, deep: true})

    watchEffect(()=>{
      const x1 = sum.value
      const x2 = person.age
      console.log('wathcEffect配置的回调执行了')
    })

    // 返回一个对象（常用）
    return {
      sum, msg, person
    }
  }
}
</script>